﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.Security;
using System.Web.UI.WebControls.WebParts;
using Sistema_Totem.Datos.SqlServer;
using System.Web.UI.HtmlControls;

namespace Sistema_Totem.Logica.Clases
{

    /// <summary>
    /// Clase Base (padre) de todos los ELEMENTOS (textBox, TextArea, FileUpload) de las Plantillas del proyecto Totem-Ucab.
    /// </summary>

    public class Elemento: WebControl
    {

        #region Atributos

        private int id;
        private string nombre;              //=> Nombre: EJ.: Contenido, Introduccion, Paso de Escenario Principal de Exito, etc.
        private string obligatoriedad;
        private int ordenE;
        private string estatusActivado;
        private string tipoDato;            //=>> puede valer numeric,  string  u  otro.
        private string nombreTipoElemento;  //=> puede valer TextBox, TextArea,  RadioButton, etc.


        //Contenido Pre-determinado, (en la Plantilla), del Elemento, una vez el usuario lo lleno:
        private string contenidoPredeterminadoElemento;

        //Contenido del Elemento, ua vez el usuario lo lleno:
        private string contenidoElemento;

        /// <summary>
        /// No manejar si no es necesario la lista recursiva de Elementos-hijo: listaElemento. 
        /// Debido a que ya con la agregacion de la clase OPCION se puede manejar las opciones subordinadas a los elelentos compuesto como: 
        ///    DropDownList, RadioButtonList y CheckBoxList.
        /// </summary>
        private List<Elemento> listaElemento = new List<Elemento>();


        #endregion Atributos


        #region Constructores

        public Elemento()
        {
        }

        public Elemento(int id, string nombre)
        {
            this.id = id;
            this.nombre = nombre;
        }

        /// <summary>
        /// Constructor realizado por el grupo 2
        /// para facilitar la creacion de elementos
        /// a  la hora de consultar.
        /// </summary>
        public Elemento(int id, string nombre,int posicion)
        {
            this.id = id;
            this.nombre = nombre;
            this.OrdenE = posicion;

        }


        /// <summary>
        /// Constructor mas recomendado, mas completo.
        /// </summary>
        /// <param name="id"></param>
        /// <param name="nombre"></param>
        /// <param name="obligatoriedad"></param>
        /// <param name="ordenE"></param>
        /// <param name="estatusActivado"></param>
        public Elemento(int id, string nombre, string obligatoriedad, int ordenE, string estatusActivado, string elContenidoPredeterminadoElemento, string elContenidoElemento)
        {
            this.id = id;
            this.nombre = nombre;
            this.obligatoriedad = obligatoriedad;
            this.ordenE = ordenE;
            this.estatusActivado = estatusActivado;
            this.contenidoPredeterminadoElemento = elContenidoPredeterminadoElemento;
            this.contenidoElemento = elContenidoElemento;
        }


        #endregion Constructores

        #region Getters y Setters

        public int Id
        {
            get { return id; }
            set { id = value; }
        }

        public string Nombre
        {
            get { return nombre; }
            set { nombre = value; }
        }

        public string Obligatoriedad
        {
            get { return obligatoriedad; }
            set { obligatoriedad = value; }
        }

        public int OrdenE
        {
            get { return ordenE; }
            set { ordenE = value; }
        }

        public string EstatusActivado
        {
            get { return estatusActivado; }
            set { estatusActivado = value; }
        }

        public string TipoDato
        {
            get { return tipoDato; }
            set { tipoDato = value; }
        }

        public string ContenidoPredeterminadoElemento
        {
            get { return contenidoPredeterminadoElemento; }
            set { contenidoPredeterminadoElemento = value; }
        }

        public string ContenidoElemento
        {
            get { return contenidoElemento; }
            set { contenidoElemento = value; }
        }

        public string NombreTipoElemento
        {
            get { return nombreTipoElemento; }
            set { nombreTipoElemento = value; }
        }


        public List<Elemento> ListaElemento
        {
            get { return listaElemento; }
            set { listaElemento = value; }
        }


        #endregion Getters y Setters


        #region Metodo Equals

        public override bool Equals(object obj)
        {

            if (obj == null || GetType() != obj.GetType())
            {
                return false;
            }

            Elemento miElemento = (Elemento)obj;

            //Listas de este objeto:
            //miElemento.listaElemento = new List<Elemento>();

            //retorna si es igual al pasado por parametro, o no:

            return (id == miElemento.id) && (nombre == miElemento.nombre) && (obligatoriedad == miElemento.obligatoriedad) && (ordenE == miElemento.ordenE) && (estatusActivado == miElemento.estatusActivado)
                //&& (this.ListaElemento.Equals(miElemento.ListaElemento))
            ;
        }


        public bool Equals2(object obj)
        {

            if (obj == null || GetType() != obj.GetType())
            {
                return false;
            }

            Elemento miElemento = (Elemento)obj;

            //Listas de este objeto:
            //miElemento.listaElemento = new List<Elemento>();

            //retorna si es igual al pasado por parametro, o no:

            return (id == miElemento.id) && (nombre == miElemento.nombre) && (obligatoriedad == miElemento.obligatoriedad) && (ordenE == miElemento.ordenE) && (estatusActivado == miElemento.estatusActivado) && (this.ListaElemento.Equals(miElemento.ListaElemento));
        }

        #endregion Metodo Equals


        #region Metodos Elemento
		

        #region Grupo 1 - Comparar Elemento

        public static  int CompararElemento( Elemento x, Elemento y)
        {
           return x.ordenE.CompareTo(y.ordenE);
        }
        #endregion Grupo 1 - Comparar Elementos


        #endregion Metodos Elemento

    }  


}